超小型インタプリタTTI ――――――――――――――――――――――――――――――――――――――― Oh!X 1989年10月号掲載 S−OS SWORD マシン語  TTI.SOS   03A00H−047B8H S:03A00H オブジェクト  TTI.OBJ   03A00H−04821H S:03A00H ZEDA用ソース  TTI.ASC 起動方法 TTI.SOSをロード J3A00 *ダンプリストとソース部のバイナリが違います  TTI.SOSはダンプリストから打ち込み  TTI.OBJはソースからアセンブルしたものです ――――――――――――――――――――――――――――――――――――――― 全機種共通S−OS“SWORD”要 小型インタプリタ言語 T T I S−OSオリジナルコンパイラTTCをインタプリタ型にしたもの、 それがこのTTIです。 これでプログラムの開発を行いTTCでコンパイルすれば、 手軽に高速プログラムを開発できますし、 インタプリタのままでも結構高速に実行できます。 小さな小さなインタプリタ TTI(Tiny Tiny Interpreter)は、 S−OS“SWORD”上で動作する 1バイト型(変数は1バイト整数)の、 簡易エディタつきインタプリタ言語です。 名前からもわかるように、 以前発表したTTCの上位コンパチのインタプリタです。 TTCは純粋なコンパイラでしたのでエディタが必要になり、 少しとっつきにくかったかもしれませんが、 このTTIと組み合わせることによって開発が容易になるでしょう。 エディタはZEDAライクなカーソルエディタ風ラインエディタ。 開始アドレスは3A00HでTTCと共存可能。 もちろん、TTCを打ち込んでいない方でも インタプリタ言語として使用できます。 文法などではTTCのものを少し改良して上位バージョンとなっています。 部分的にはどうしてもインタプリタで実現できないものもありますので 完全なコンパチではありませんが、 ふつうにプログラミングを行ううえではそれほど不都合はないでしょう。 追加された命令を使用しなければ、 そのままTTCでコンパイルして高速実行できます。 ・―               ―・ |     TTIの特徴      | ・―               ―・ TTCの命令をほぼ含むほか、以下の命令 が追加されています。 1)@GOTO、@GOSUB   飛び先は1〜 255に限られますが、ラベルに式が使えます。   例)     .A=9 @GOTO A+1     ラベル10に分岐します。 2)PUSH、POP 3)@IF   BASICのIFと同等です。   例)     @IF A=1 "ABCDE"     Aが1のとき、ABCDEを表示します。 4)LOOPA、LOOPB   これは、    DEC A IF A#0,ラベル (LOOPA)    DEC B IF A#0,ラベル (LOOPB)   をひとまとめにした命令です。   動作はマシン語のDJNZと同等で、   速さを意識した命令です。   TTCでコンパイルするときは上記のように展開してください。 5)関数 (S   これはいわゆるSCRN$関数でカーソル位置の文字コードを値とします。 ・―               ―・ |     入力&実行方法     | ・―               ―・ 使用するプログラムはリスト1の1本だけです。 MACINTO−Cなどのマシン語入力ツールから打ち込んで、 実行アドレス3A00Hでセーブしてください。 S−OS“SWORD”のモニタから、  #J3A00 と入力すると、コールドスタートします。 また、3A03Hにジャンプすれば ホットスタート(テキストエリアを初期化しない)します。 図1 メモリマップ ・――――――――――――――――――――――・ |                      | | $3A00・―――――・ $0000・―――――・| |    |テキスト・エディタ|    | ラベル  || | $3DAD|―――――|    | テーブル  || |    |TTIインタプリタ| $1000・―――――・| |    | 本体  |           | | $4565|―――――|  特殊ワークエリア | |    | ワークエリア |           | | $47B8・―――――・           | ・――――――――――――――――――――――・ ・―               ―・ |      使用方法       | ・―               ―・ タイトル表示後、プロンプト ']'が表示され、入力待ちになります。 ]に続いてコマンド一覧のコマンドを入力すると そのコマンドが実行されます。 また、1文字以上のスペースをつけてTTIの命令を入力すると、 その命令が実行されます(ふつうのBASICのダイレクトモード)。 例)   ] BELL 5   ビープ音が5回鳴ります。 エディタを使ううえでの注意点は、 1)テキストの入力において、I(追加)、   B(挿入)を使い分けなければならない 2)nはラベルでなく、   Tコマンドのリスト表示でエディタがつけた行番号である 3)nは省略できない です。 なお、コマンド中断はSHIFT+BREAKです。 プログラムの実行はGコマンドです。 また、プログラムを途中から実行するには、 実行させたい場所にラベルをつけて、  ] GOTO ラベル とします。 実行中エラーが出ると、 エラーメッセージとエラーが出た行を表示して止まります。 エラーコード表を参照して修正してください。 また、SHIFT+BREAKを押すと、 プログラムの実行を中断できます(多少止まりにくいことがあります)。 ・―               ―・ |     TTCとの違い     | ・―               ―・ TTIはインタプリタのため、以下の点がTTCとは違います。 TTCで動かすプログラムを書くときは気をつけてください。 1)DB、DW、DM命令は使えない 2)REPEAT〜UNTIL ループの途中でGOTOで抜け出してはいけない 3)PUT、GET命令の扱いが違う   例)DEレジスタの値を渡して、2000HをCALLする場合。     TTI      TTC      PUTDE X,Y     PUTDE X,Y      CALL $20,$00   DB $CD,$00,$20   これは、TTCがCALL命令を出力する際、   A、Dレジスタを破壊するコードを出すためです。   したがってAレジスタを渡す場合も同様にしなければなりません。   参考までに、TTCでDE、Aレジスタの値を渡して   マシン語ルーチンを呼び出してDE、Aレジスタの値を受ける場合は、      PUTDE X,Y      PUTA Z      DB $CD,$00,$20      GETA Z      GETDE X,Y   の順番で書かなければなりません。 4)インタプリタのみの命令はTTIでしか使えない 当然のことながら、コンパイルを前提としたプログラム開発を行うときには、 インタプリタ専用の命令をどのように置き換えていくかということを あらかじめよく考えてから開発したほうがよいでしょう。 もちろん、コンパチの部分しか使わなくともプログラムを記述できますけど。 さて、スピードが気になる人もいると思いますが、 7月号のTICBANが 301行のB=0をB=4に書き換えるだけで コンパイルしなくても十分遊べるので、結構速いと思います。 もっとも、TTIで書いて遅ければ TTCでコンパイルすればいいわけですから あまり問題ではないと思います。 TTIと組み合わせることによってTTCがとても使いやすくなるので、 TTCを使っている方はぜひ入力してください。 次回作は、MAGICもサポートした 2バイト長のスタック型言語を予定しています。 期待しないで待っててください。